/* * Copyright (C) 2015 Sebastian Daschner, sebastian-daschner.com * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sebastian_daschner.jaxrs_analyzer.analysis.results; import com.sebastian_daschner.jaxrs_analyzer.builder.*; import com.sebastian_daschner.jaxrs_analyzer.model.Types; import com.sebastian_daschner.jaxrs_analyzer.model.rest.*; import com.sebastian_daschner.jaxrs_analyzer.model.results.ClassResult; import com.sebastian_daschner.jaxrs_analyzer.model.results.MethodResult; import com.sun.javadoc.MethodDoc; import com.sun.javadoc.ParamTag; import com.sun.javadoc.Parameter; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; import static com.sebastian_daschner.jaxrs_analyzer.analysis.results.TypeUtils.STRING_IDENTIFIER; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ResultInterpreterTest { private ResultInterpreter classUnderTest; @Before public void setUp() { classUnderTest = new ResultInterpreter(); } @Test public void testStandard() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .build(); expectedResult.addMethod("test", resourceMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path/").build(); final MethodResult method = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes(Types.STRING).build()) .andMethod(HttpMethod.GET).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testSubResource() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .build(); expectedResult.addMethod("test", resourceGetMethod); final ResourceMethod resourcePostMethod = ResourceMethodBuilder.withMethod(HttpMethod.POST) .andResponse(204, ResponseBuilder.newBuilder().build()).build(); expectedResult.addMethod("test/sub", resourcePostMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("/path").build(); final MethodResult method = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes(Types.STRING).build()) .andMethod(HttpMethod.GET).build(); final MethodResult subResourceLocator = MethodResultBuilder.newBuilder().andPath("/sub").build(); final MethodResult subResourceMethod = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(204).build()).andMethod(HttpMethod.POST).build(); subResourceLocator.setSubResource(ClassResultBuilder.withResourcePath(null).andMethods(subResourceMethod).build()); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("/test").andMethods(method, subResourceLocator).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testRootResource() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourcePostMethod = ResourceMethodBuilder.withMethod(HttpMethod.POST) .andResponse(204, ResponseBuilder.newBuilder().build()).build(); expectedResult.addMethod("test", resourcePostMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult subResourceMethod = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(204).build()).andPath("/test").andMethod(HttpMethod.POST).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("/").andMethods(subResourceMethod).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testNormalizeGenericEntityNoCollection() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .build(); expectedResult.addMethod("test", resourceGetMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult method = MethodResultBuilder .withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes("Ljavax/ws/rs/core/GenericEntity<Ljava/lang/String;>;").build()) .andMethod(HttpMethod.GET).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testContentTypes() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .andResponseMediaTypes("application/xml").build(); expectedResult.addMethod("test", resourceGetMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult method = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes(Types.STRING).build()) .andMethod(HttpMethod.GET).andResponseMediaTypes("application/xml").build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testOverrideAnnotationContentType() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .andResponseMediaTypes("application/json").build(); expectedResult.addMethod("test", resourceGetMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult method = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(200).andContentTypes("application/json") .andEntityTypes(Types.STRING).build()) .andMethod(HttpMethod.GET).andResponseMediaTypes("application/xml", "application/json").build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testNestedBasePath() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path/nested"); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .andResponseMediaTypes("application/json").build(); expectedResult.addMethod("test", resourceGetMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path/nested").build(); final MethodResult method = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes(Types.STRING).build()) .andMethod(HttpMethod.GET).andResponseMediaTypes("application/json").build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testDefaultStatusCodes() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .andResponseMediaTypes("application/json").build(); final ResourceMethod resourcePostMethod = ResourceMethodBuilder.withMethod(HttpMethod.POST).andResponse(204, ResponseBuilder.newBuilder().build()) .andRequestBodyType(Types.STRING).build(); expectedResult.addMethod("test", resourceGetMethod); expectedResult.addMethod("test", resourcePostMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult getMethod = MethodResultBuilder.withResponses(HttpResponseBuilder.newBuilder().andEntityTypes(Types.STRING).build()) .andMethod(HttpMethod.GET).andResponseMediaTypes("application/json").build(); final MethodResult postMethod = MethodResultBuilder.newBuilder().andMethod(HttpMethod.POST).andRequestBodyType(Types.STRING).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(getMethod, postMethod).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testNormalize() { final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final TypeIdentifier stringListIdentifier = TypeIdentifier.ofType("Ljava/util/List<Ljava/lang/String;>;"); final TypeRepresentation stringList = TypeRepresentation.ofCollection(stringListIdentifier, TypeRepresentation.ofConcrete(STRING_IDENTIFIER)); expectedResult.getTypeRepresentations().put(stringListIdentifier, stringList); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(stringListIdentifier).build()) .build(); expectedResult.addMethod("test", resourceGetMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult method = MethodResultBuilder .withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes("Ljavax/ws/rs/core/GenericEntity<Ljava/util/List<Ljava/lang/String;>;>;").build()) .andMethod(HttpMethod.GET).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test public void testAmbiguousEntityTypes() { final String configurationType = "Lcom/sebastian_daschner/jaxrs_analyzer/analysis/results/ResultInterpreterTest$ConfigurationManager$Configuration;"; final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final TypeIdentifier identifier = TypeIdentifier.ofType(configurationType); expectedResult.getTypeRepresentations().put(identifier, TypeRepresentation.ofConcrete(identifier, Collections.singletonMap("name", STRING_IDENTIFIER))); final ResourceMethod resourceGetMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET) .andResponse(200, ResponseBuilder.withResponseBody(identifier).build()) .andResponse(204, ResponseBuilder.newBuilder().build()) .build(); expectedResult.addMethod("test", resourceGetMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path").build(); final MethodResult method = MethodResultBuilder .withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes(Types.OBJECT, configurationType).build(), HttpResponseBuilder.withStatues(204).build()) .andMethod(HttpMethod.GET).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } @Test @Ignore public void testDescriptions() { final MethodDoc methodDocMock = mock(MethodDoc.class); when(methodDocMock.commentText()).thenReturn("Method description."); when(methodDocMock.paramTags()).thenReturn(new ParamTag[0]); when(methodDocMock.parameters()).thenReturn(new Parameter[0]); final Resources expectedResult = new Resources(); expectedResult.setBasePath("path"); final ResourceMethod resourceMethod = ResourceMethodBuilder.withMethod(HttpMethod.GET, "Method description.") .andQueryParam("query", "Ljava/lang/String;", null) .andResponse(200, ResponseBuilder.withResponseBody(STRING_IDENTIFIER).build()) .build(); expectedResult.addMethod("test", resourceMethod); final ClassResult appPathResult = ClassResultBuilder.withApplicationPath("path/").build(); final MethodResult method = MethodResultBuilder.withResponses(HttpResponseBuilder.withStatues(200).andEntityTypes(Types.STRING).build()) .andMethodDoc(methodDocMock) .andQueryParam("query", "Ljava/lang/String;", null) .andMethod(HttpMethod.GET).build(); final ClassResult resClassResult = ClassResultBuilder.withResourcePath("test").andMethods(method).build(); final Set<ClassResult> results = new HashSet<>(Arrays.asList(appPathResult, resClassResult)); final Resources actualResult = classUnderTest.interpret(results); assertEquals(expectedResult, actualResult); } private interface ConfigurationManager { @XmlAccessorType(XmlAccessType.FIELD) class Configuration { private String name; } } }